class Solution {
    //nums中只有一种数字出现了奇数次，其他数字出现了偶数次
    public int singleNumber(int[] nums) {
        // 异或
        // a ^ 0 = a;
        // a ^ a = 0;
        int a = 0;
        for(int i = 0; i < nums.length; i++){
            a ^= nums[i];
        }
        return a;
    }
}
class Solution {
    //nums有 两种 数字出现了奇数次，其他数字出现了偶数次
    public int singleNumber2(int[] nums) {
        int eor = 0;
        // 设两种数字为 a,b
        for(int i = 0; i < nums.length; i++){
            eor ^= nums[i];
        }
        // 循环结束后 eor = a ^ b
        // eor ！= 0 => eor的比特位中必有一个位置为1
        int rightOne = eor &(~eor + 1); // 提取出最右边的1
        int onlyOne = 0;
        for(int cur : nums){
            if(cur & rightOne == 1){
                onlyOne ^= cur; //循环结束后onlyOne的值为 a,b 之一
            }
        }
        return onlyOne + (eor ^ onlyOne);//返回a+b
    }
}